﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using ProyectoVeranoAECAasp.IOAccesos;
using ProyectoVeranoAECAasp.AccesoDatos.ClasesMiscelaneas;

namespace ProyectoVeranoAECAasp.AccesoDatos.Clases
{
    public class ProcedimientosBaseDatos
    {
        // -| Metodos | ------------
        //-------------------------------- GestionarBandejaSolis.aspx --------------------------
        // - ejecutaSP_ObtenerSolicitudesSegunFiltro: Ejecuta el SP de sp_ObtenerSolicitudesSegunFiltro
        public List<Elementos_SP_ObtenerSolicitudesSegunFiltro> ejecutaSP_ObtenerSolicitudesSegunFiltro(int p_estadoChBPendientes,
            int p_estadoChBAprobadas, int p_estadoChBDenegadas, String p_UsuarioLogin, 
            String p_FechaIni, String p_FechaFin)
        {
            String sql = @"sp_ObtenerSolicitudesSegunFiltro";
            String miCadenaConexion = "";
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_Pendientes", p_estadoChBPendientes));
                sentencia.Parameters.Add(new SqlParameter("@pi_Aprobadas", p_estadoChBAprobadas));
                sentencia.Parameters.Add(new SqlParameter("@pi_Denegadas", p_estadoChBDenegadas));
                sentencia.Parameters.Add(new SqlParameter("@pi_UsuarioLogin", p_UsuarioLogin));
                if (p_FechaIni != "")
                {
                    sentencia.Parameters.Add(new SqlParameter("@pi_FechaIni", Convert.ToDateTime(p_FechaIni)));
                }
                else
                {
                    sentencia.Parameters.Add(new SqlParameter("@pi_FechaIni", p_FechaIni));
                }
                if (p_FechaFin != "")
                {
                    sentencia.Parameters.Add(new SqlParameter("@pi_FechaFin", Convert.ToDateTime(p_FechaFin)));
                }
                else
                {
                    sentencia.Parameters.Add(new SqlParameter("@pi_FechaFin", p_FechaFin));
                }

                SqlDataReader drStore = sentencia.ExecuteReader();

                List<Elementos_SP_ObtenerSolicitudesSegunFiltro> listaSolics = new List<Elementos_SP_ObtenerSolicitudesSegunFiltro>();
                while (drStore.Read())
                {
                    listaSolics.Add(new Elementos_SP_ObtenerSolicitudesSegunFiltro(
                        drStore.GetValue(0).ToString(),
                        drStore.GetValue(1).ToString(),
                        drStore.GetValue(2).ToString(),
                        drStore.GetValue(3).ToString()
                        ));
                }
                //----
                return listaSolics;
            }
        }

        // - ejecutaSP_DatosSolicitudSeleccionada: Ejecuta el SP SP_DatosSolicitudSeleccionada
        public List<String> ejecutaSP_DatosSolicitudSeleccionada(int p_IDSolicitud)
        {
            String sql = @"sp_DatosSolicitudSeleccionada";
            String miCadenaConexion = "";
            List<String> listaDatosSolicitud = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_IDSolicitud", p_IDSolicitud));

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaDatosSolicitud.Add(drStore.GetValue(0).ToString());
                    listaDatosSolicitud.Add(drStore.GetValue(1).ToString());
                    listaDatosSolicitud.Add(drStore.GetValue(2).ToString());
                    listaDatosSolicitud.Add(drStore.GetValue(3).ToString());
                    listaDatosSolicitud.Add(drStore.GetValue(4).ToString());
                    listaDatosSolicitud.Add(drStore.GetValue(5).ToString());
                }
                //----
                return listaDatosSolicitud;
            }
        }

        // - ejecutaSP_ObtenerHorarioSolic: Ejecuta el SP SP_ObtenerHorarioSolic
        public List<String> ejecutaSP_ObtenerHorarioSolic(int p_IDSolicitud)
        {
            String sql = @"sp_ObtenerHorarioSolic";
            String miCadenaConexion = "";
            List<String> listaHorasSolicitud = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_IDSolicitud", p_IDSolicitud));

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaHorasSolicitud.Add(drStore.GetValue(0).ToString());
                    listaHorasSolicitud.Add(drStore.GetValue(1).ToString());
                }
                //----
                return listaHorasSolicitud;
            }
        }

        // - ejecutaSP_ActualizarEstadoSolic: Ejecuta el SP SP_ActualizarEstadoSolic
        public int ejecutaSP_ActualizarEstadoSolic(int p_IDSolicitud, int p_IDEstadoSol)
        {
            String sql = @"sp_ActualizarEstadoSolic";
            String miCadenaConexion = "";
            int estadoEjecucionSP = 0;
            String mensajeError = "";
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();
                int columnasAfectadas = 0;

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_IDSolicitud", p_IDSolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_IDEstadoSolicitud", p_IDEstadoSol));

                try
                {
                    columnasAfectadas = sentencia.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    mensajeError = e.Message;
                    if ((mensajeError != null) || (mensajeError != ""))
                    {
                        estadoEjecucionSP = -1;
                    }
                }
                //----
                return estadoEjecucionSP;
            }
        }

        // - ejecutaSP_ObtenerTodasSolicitudesAprobadas: Ejecuta SP_ObtenerTodasSolicitudesAprobadas
        // que trae todas las solics aprobadas
        public List<int> ejecutaSP_ObtenerSolsXEstadoMatchFechaEsp(String p_fecha, String p_espacio, int p_estado)
        {
            String sql = @"sp_ObtenerSolsXEstadoMatchFechaEsp";
            String miCadenaConexion = "";
            List<int> listaIDSolicsAprob = new List<int>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_fecha", Convert.ToDateTime(p_fecha)));
                sentencia.Parameters.Add(new SqlParameter("@pi_espacio", p_espacio));
                sentencia.Parameters.Add(new SqlParameter("@pi_estado", p_estado));

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaIDSolicsAprob.Add(Convert.ToInt32(drStore.GetValue(0)));
                }
                //----
                return listaIDSolicsAprob;
            }
        }

        // - ejecutaSP_ObtenerLogins: Ejecuta SP_ObtenerLogins
        // que trae todos los Logins de los usuarios en la base
        public List<String> ejecutaSP_ObtenerLogins()
        {
            String sql = @"sp_ObtenerLogins";
            String miCadenaConexion = "";
            List<String> listaLogins = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaLogins.Add(drStore.GetValue(0).ToString());
                }
                //----
                return listaLogins;
            }
        }


//============================================================================================
        //-------------------------------- SolicitarReservacion.aspx --------------------------
        // - ejecutaSP_ObtenerListaEspacios: Ejecuta el SP SP_ObtenerListaEspacios
        public List<String> ejecutaSP_ObtenerListaEspacios()
        {
            String sql = @"sp_ObtenerListaEspacios";
            String miCadenaConexion = "";
            List<String> listaEspacios = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaEspacios.Add(drStore.GetValue(0).ToString());
                }
                //----
                return listaEspacios;
            }
        }

        // - ejecutaSP_ObtenerListaEscuelas: Ejecuta el SP SP_ObtenerListaEscuelas
        public List<String> ejecutaSP_ObtenerListaEscuelas()
        {
            String sql = @"sp_ObtenerListaEscuelas";
            String miCadenaConexion = "";
            List<String> listaEscuelas = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaEscuelas.Add(drStore.GetValue(0).ToString());
                    listaEscuelas.Add(drStore.GetValue(1).ToString());
                }
                //----
                return listaEscuelas;
            }
        }

        // - ejecutaSP_ObtenerListaCarrerasXEscuela: Ejecuta el SP SP_ObtenerListaCarrerasXEscuela
        public List<String> ejecutaSP_ObtenerListaCarrerasXEscuela(int p_IDEscuela)
        {
            String sql = @"sp_ObtenerListaCarrerasXEscuela";
            String miCadenaConexion = "";
            List<String> listaCarrerasXEscuela = new List<String>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_IDEscuela", p_IDEscuela));

                SqlDataReader drStore = sentencia.ExecuteReader();

                while (drStore.Read())
                {
                    listaCarrerasXEscuela.Add(drStore.GetValue(0).ToString());
                    listaCarrerasXEscuela.Add(drStore.GetValue(1).ToString());
                }
                //----
                return listaCarrerasXEscuela;
            }
        }

        // - ejecutaSP_ObtenerHorasAsuntoUserXEspacioResXFecha: Ejecuta el SP sp_ObtenerHorasAsuntoUserXEspacioResXFecha
        public List<Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha> 
            ejecutaSP_ObtenerHorasAsuntoUserXEspacioResXFecha(String p_Fecha, 
            String p_IDEspacio)
        {
            String sql = @"sp_ObtenerHorasAsuntoUserXEspacioResXFecha";
            String miCadenaConexion = "";
            List<Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha> listaHorarioXEspXFecha = 
                new List<Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha>();
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_FechaAConsultar", Convert.ToDateTime(p_Fecha)));
                sentencia.Parameters.Add(new SqlParameter("@pi_IDEspacio", p_IDEspacio));

                SqlDataReader drStore = sentencia.ExecuteReader();

                String modoHora = "";
                while (drStore.Read())
                {
                    if(drStore.GetValue(1).ToString() == "False")
                    {
                        modoHora = "a.m.";
                    }
                    else
                    {
                        modoHora = "p.m.";
                    }

                    Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha elemento;
                    elemento = new Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha(
                        drStore.GetValue(0).ToString() + " " + modoHora, drStore.GetValue(2).ToString(),
                         drStore.GetValue(3).ToString());
                    listaHorarioXEspXFecha.Add(elemento);
                }
                //----
                return listaHorarioXEspXFecha;
            }
        }

        // - traerHorasADisposicion: Trae de la base las horas disponibles para que se
        // hagan solicitudes
        public List<String> traerHorasADisposicion()
        {
            List<String> listaHoras;
            //----
            //Busqueda en la base de datos de la existencia del usuario
            String sql = @"SELECT HoraSolicitud.Hora, HoraSolicitud.Modalidad
                           FROM HoraSolicitud";
            //----
            String miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                SqlDataReader drStore = sentencia.ExecuteReader();
                String modoHora = "";
                listaHoras = new List<String>();

                while (drStore.Read())
                {
                    if (drStore.GetValue(1).ToString() == "False")
                    {
                        modoHora = "a.m.";
                    }
                    else
                    {
                        modoHora = "p.m.";
                    }
                    listaHoras.Add(drStore.GetValue(0).ToString() + " " +
                        modoHora);
                }
                //----
                return listaHoras;
            }
            //----
        }

        // - ejecutaSP_HacerSolicitud: Llama a SP_HacerSolicitud para hacer una solicitud
        // a la base de datos
        public int ejecutaSP_HacerSolicitud(String p_asuntoSolicitud, int p_idEscuelaSolicitud, 
            int p_idCarreraSolicitud, String p_descripcionSolicitud, int p_cantidadHorasReservadas,
            DateTime p_fechaReservar, String p_espacioReservar, int p_IDUsuarioEmisor)
        {
            String sql = @"sp_HacerSolicitud";
            String miCadenaConexion = "";
            int estadoEjecucionSP = 0;
            String mensajeError = "";
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();
                int columnasAfectadas = 0;

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_Asunto", p_asuntoSolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_idEscuelaSolicitud", p_idEscuelaSolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_idCarreraSolicitud", p_idCarreraSolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_Descripcion", p_descripcionSolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_CantidadTotalHoras", p_cantidadHorasReservadas));
                sentencia.Parameters.Add(new SqlParameter("@pi_FechaDiaReservado", p_fechaReservar));
                sentencia.Parameters.Add(new SqlParameter("@pi_espacioReservar", p_espacioReservar));
                sentencia.Parameters.Add(new SqlParameter("@pi_IDUsuarioEmisor", p_IDUsuarioEmisor));

                SqlParameter parametroSalidaSolicitudHecha = new SqlParameter();
                parametroSalidaSolicitudHecha.ParameterName = "@po_IDSolicitudHecha";
                parametroSalidaSolicitudHecha.SqlDbType = SqlDbType.Int;
                parametroSalidaSolicitudHecha.Direction = ParameterDirection.Output;

                sentencia.Parameters.Add(parametroSalidaSolicitudHecha);

                try
                {
                    columnasAfectadas = sentencia.ExecuteNonQuery();
                    estadoEjecucionSP = Convert.ToInt32(sentencia.Parameters["@po_IDSolicitudHecha"].Value);
                }
                catch (Exception e)
                {
                    mensajeError = e.Message;
                    if ((mensajeError != null) || (mensajeError != ""))
                    {
                        estadoEjecucionSP = -1;
                    }
                }
                //----
                return estadoEjecucionSP;
            }
        }

        // - ejecutaSP_IngresarHoraSolicitud: Permite, una vez hecha una solicitud, 
        // registrar UNA hora de las q se seleccionan (este proc se llama tnatas horas haya)
        public void ejecutaSP_IngresarUnaHoraSolicitud(int p_IDsolicitud, int p_seReservaTodo, 
            String p_hora, int pi_modalidad)
        {
            String sql = @"sp_IngresarUnaHoraSolicitud";
            String miCadenaConexion = "";
            String mensajeError = "";
            //----
            miCadenaConexion = ManejoArchivos.leer_CadenaCNX();
            using (SqlConnection conexionDB = new SqlConnection(miCadenaConexion))
            {
                conexionDB.Open();
                int columnasAfectadas = 0;

                SqlCommand sentencia = new SqlCommand(sql, conexionDB);
                sentencia.CommandType = CommandType.StoredProcedure;
                sentencia.Parameters.Add(new SqlParameter("@pi_IDsolicitud", p_IDsolicitud));
                sentencia.Parameters.Add(new SqlParameter("@pi_seReservaTodo", p_seReservaTodo));
                sentencia.Parameters.Add(new SqlParameter("@pi_hora", p_hora));
                sentencia.Parameters.Add(new SqlParameter("@pi_modalidad", pi_modalidad));

                try
                {
                    columnasAfectadas = sentencia.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    mensajeError = e.Message;
                    if ((mensajeError != null) || (mensajeError != ""))
                    {
                        columnasAfectadas = -1;
                    }
                }
                //----
            }
        }
    }
}
